package iso2.pruebas;

import iso2.dominio.Usuario;
import iso2.persistencia.Agente;
import iso2.persistencia.ConexionesOcupadasException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import junit.framework.TestCase;

public class TestModificarUsuario extends TestCase {

	private Connection conexion;

	/* usuarios */
	private Usuario usu;
	private Usuario noExistente;
	private Agente agente;

	protected void setUp() {
		usu = new Usuario("usu", "nueva", "nueva dir", true, false);
		noExistente = new Usuario("no", "no", "dir no", true, false);

		agente = Agente.getInstancia();
		try {
			conexion = agente.getConexion();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ConexionesOcupadasException e) {
			e.printStackTrace();
		}

	}

	protected void tearDown() {
		agente.liberarConexion(conexion);
	}

	public void testbajaUsuarioPersistencia_ok() {
		/*
		 * Si el método no funciona tirará una excepción y no debe hacerlo. Es un
		 * oráculo en positivo
		 */

		try {
			usu.updateUsuario("usu", "usu", "usu", "");
			PreparedStatement sentencia = conexion
					.prepareStatement("select * from usuario where email = ?;");

			sentencia.setString(1, usu.getEmail());

			ResultSet resultado = sentencia.executeQuery();
			if (resultado.next()) {
				assertEquals("Comprobando pass en bd","nueva",resultado.getString("password"));
				assertEquals("Comprobando dir en bd","nueva dir",resultado.getString("direccion"));
			}
			else{
				fail("Debería devolver algo la consulta");
			}
		} catch (SQLException e) {
			fail(e.toString());
		} catch (ConexionesOcupadasException e) {
			fail(e.toString());
		} catch (Exception e) {
			fail(e.toString());
		}

	}

	public void testValidarPersistencia_noExistente() {
		/*
		 * Si el método funciona tirará una excepción y debe hacerlo. Es un
		 * oráculo en negativo
		 */
		try {
			noExistente.updateUsuario("noExistente", "", "", "");
			fail("Esperaba excepción");
		}
		
		catch (SQLException e) {}

		catch (ConexionesOcupadasException e) {
			fail(e.toString());
		} catch (Exception e) {
			fail(e.toString());
		}
	}
}
